package org.uc3m.ed.tad.arbol;

/**
 * Definicion del nodo utilizado para implementar el TAD Arbol Binario mediante
 * estructuras dinamicas.
 * 
 * @author DEI - ED
 * @version 1.0
 */
class ArbolBinarioNodo<C, E> {

	/**
	 * Clave del dato representado por el nodo.
	 */
	private C _clave;

	/**
	 * Elemento, dato, representado por el nodo.
	 */
	private E _elemento;
	
	/**
	 * Referencia al padre del nodo.
	 */
	private ArbolBinarioNodo<C, E> _padre;		

	/**
	 * Referencia a la raiz del subarbol situado a la izquierda del nodo.
	 */
	private ArbolBinarioNodo<C, E> _izquierdo;

	/**
	 * Referencia a la raiz del subarbol situado a la derecha del nodo
	 * 
	 * @see ArbolBinarioBusquedaNodo<C,E>
	 */
	private ArbolBinarioNodo<C, E> _derecho;

	/**
	 * Crea un nodo del arbol binario sin datos.
	 */
	public ArbolBinarioNodo() {
		_clave = null;
		_elemento = null;
		_padre = null;
		_izquierdo = null;
		_derecho = null;
	}

	/**
	 * Crea un nodo del arbol binario para un dato determinado.
	 * 
	 * @param clave
	 *            Clave del dato representado por el nodo.
	 * @param elemento
	 *            Dato representado por el nodo.
	 */
	public ArbolBinarioNodo(C clave, E elemento) {
		_clave = clave;
		_elemento = elemento;
		_padre = null;
		_izquierdo = null;
		_derecho = null;
	}

	/**
	 * Asigna la clave del dato representado por el nodo
	 * 
	 * @param clave
	 *            Clave del dato representado por el nodo.
	 */
	void asignarClave(C clave) {
		_clave = clave;
	}

	/**
	 * Asigna el dato representado por el nodo
	 * 
	 * @param elemento
	 *            Dato representado por el nodo.
	 */
	void asignarElemento(E elemento) {
		_elemento = elemento;
	}
	
	/**
	 * Asigna el nodo padre en el arbol.
	 * 
	 * @param padre
	 *            Padre del nodo.
	 */
	void asignarPadre(ArbolBinarioNodo<C, E> padre) {
		_padre = padre;
	}	

	/**
	 * Asigna el nodo raiz del subarbol situado a la izquierda.
	 * 
	 * @param izquierdo
	 *            Nodo raiz del subarbol de la izquierda.
	 */
	void asignarIzquierdo(ArbolBinarioNodo<C, E> izquierdo) {
		_izquierdo = izquierdo;
	}

	/**
	 * Asigna el nodo raiz del subarbol situado a la derecha.
	 * 
	 * @param siguiente
	 *            Nodo raiz del subarbol de la derecha.
	 */
	void asignarDerecho(ArbolBinarioNodo<C, E> derecho) {
		_derecho = derecho;
	}

	/**
	 * Recupera la clave del valor representado por el elemento.
	 * 
	 * @return Clave del valor representado por el elemento.
	 */
	C obtenerClave() {
		return _clave;
	}

	/**
	 * Recupera el valor representado por el elemento.
	 * 
	 * @return Valor representado por el elemento.
	 */
	E obtenerElemento() {
		return _elemento;
	}

	/**
	 * Recupera el padre del nodo.
	 * 
	 * @return Padre del nodo en el arbol.
	 */
	ArbolBinarioNodo<C, E> obtenerPadre() {
		return _padre;
	}	
	
	/**
	 * Recupera la raiz del subarbol situado a la izquierda del nodo.
	 * 
	 * @return Raiz del subarbol situado a la izquierda del nodo.
	 */
	ArbolBinarioNodo<C, E> obtenerIzquierdo() {
		return _izquierdo;
	}

	/**
	 * Recupera la raiz del subarbol situado a la derecha del nodo.
	 * 
	 * @return Raiz del subarbol situado a la derecha del nodo
	 */
	ArbolBinarioNodo<C, E> obtenerDerecho() {
		return _derecho;
	}
}
